package com.atguigu.gmall.payment.controller;

import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import com.atguigu.gmall.payment.config.AlipayConfig;
import com.atguigu.gmall.payment.service.AlipayService;
import com.atguigu.gmall.payment.service.PaymentInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.annotation.PostConstruct;
import java.util.Map;

/**
 * @author 李旭
 * @date 2021/12/4 14:31
 * @Description:
 *
 *  Alipay 支付宝
 *
 *  http://api.gmall.com/api/payment/alipay/submit/4
 */
@Controller
@RequestMapping("/api/payment/alipay")
public class AlipayController {


    @Autowired
    private AlipayService alipayService;
    @Autowired
    private PaymentInfoService paymentInfoService;

    //获取二维码支付页面
    @GetMapping("/submit/{orderId}")
    @ResponseBody // 不会跳转视图 会直接返回String
    public String submit(@PathVariable Long orderId){
        return alipayService.submit(orderId);//转发视图页面  我们没有支付宝页面 我们只能返回值String
    }
    //将来支付成功之后   支付宝公司同步通知支付微服务
    @GetMapping("/callback/return")
    public String callbackReturn(){
        //重定向到页面微服务的地址
        return "redirect:" + AlipayConfig.return_order_url;
    }
    //异步通知     8次通知 success  4m 10m 10m ..
    @PostMapping("/callback/notify")
    @ResponseBody //将异步通知中收到的所有参数都存放到map中
    public String callbackNotify(@RequestParam Map<String, String> paramsMap){
        //校验签名 （是否是支付宝公司的签名 ）
        boolean signVerified = false;//调用SDK验证签名
        try {
            signVerified = AlipaySignature.rsaCheckV1(paramsMap,
                    AlipayConfig.alipay_public_key, AlipayConfig.charset,
                    AlipayConfig.sign_type);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        if(signVerified){
            //验签成功后，按照支付结果异步通知中的描述，
            //  对支付结果中的业务内容进行二次校验，
            //  校验成功后在response中返回success并继续商户自身业务处理，校验失败返回failure
            //二次校验   订单如果是68488.00  异步通知结果中如果不是68488.00元
            //即使支付成功了 对于结果我们不满意  总金额不正确

            System.out.println(paramsMap);
            //更新支付表
            if("TRADE_SUCCESS".equals(paramsMap.get("trade_status"))){
                paymentInfoService.update(paramsMap);
            }
            /**
             * {
             *   gmt_create=2021-12-06 15:19:03,
             *   charset=utf-8,
             *   gmt_payment=2021-12-06 15:19:13,
             *   notify_time=2021-12-06 15:19:14,
             *   subject=Apple iPhone 11 (A2223) 128GB 黑色 移动联通电信4G手机 双卡双待 Apple iPhone 11 (A2223) 256GB 红色 移动联通电信4G手机 双卡双待 Ap,
             *   buyer_id=2088102181130586,
             *   invoice_amount=126979.00,
             *   version=1.0,
             *   notify_id=2021120600222151913030580519730851,
             *   fund_bill_list=[{
             *   "amount":"126979.00",
             *   "fundChannel":"ALIPAYACCOUNT"}],
             *   notify_type=trade_status_sync,
             *   out_trade_no=qwwewrrdd16789598851723qwee,
             *   total_amount=126979.00,
             *   trade_status=TRADE_SUCCESS,
             *   trade_no=2021120622001430580501836492,
             *   auth_app_id=2016102100732915,
             *   receipt_amount=126979.00,
             *   point_amount=0.00,
             *   app_id=2016102100732915,
             *   buyer_pay_amount=126979.00,
             *   seller_id=2088102180533564}
             *
             *
             */


            //int i = 1/0;
            return "success";
        }else{
            // TODO 验签失败则记录异常日志，并在response中返回failure.
            return "failure";
        }
    }



}
